/**
 * 
 */
package com.ubo.java.associations;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.ubo.java.model.classifier.IClassifier;
import com.ubo.util.Duo;

/**
 * 
 * @author saludegu
 * 
 */
public class AssociationManager {

	/**
	 * Enregistre les classifiers en fonctions de leur id.
	 */
	protected Map<Integer, IClassifier> mClassifiers;

	/**
	 * Gestionnaire d'identifiants de classifiers.
	 */
	protected EntityIdProvider mIdProvider;

	/**
	 * Liste des associations.
	 */
	protected List<Association> mAssociations;

	/**
	 * 
	 * Constructor
	 * 
	 */
	public AssociationManager() {
		mClassifiers = new HashMap<Integer, IClassifier>(0);
		mIdProvider = new EntityIdProvider();
		mAssociations = new ArrayList<Association>(0);
	}

	/**
	 * Enregistrement d'une association entre deux classifiers uniques.
	 * 
	 * @param association
	 */
	public void addAssociation(Duo<Integer, IClassifier> associationFrom,
			Duo<Integer, IClassifier> associationTo,
			EAssociationType associationType, Card card1, Card card2) {
		// Enregistrement des classifiers.
		if (!mClassifiers.containsKey(associationFrom.getA()))
			mClassifiers.put(associationFrom.getA(), associationFrom.getB());
		if (!mClassifiers.containsKey(associationTo.getA()))
			mClassifiers.put(associationTo.getA(), associationTo.getB());
		Association newAssociation = new Association(associationFrom.getA(),
				associationTo.getA(), associationType, card1, card2);
		mAssociations.add(newAssociation);
	}

	/**
	 * Renvoie la liste des associations.
	 * 
	 * @return
	 */
	public Collection<Association> getAssociations() {
		return mAssociations;
	}

	/**
	 * Renvoie l'id d'un classifier ou -1 sinon.
	 * 
	 * @param classifier
	 * @return
	 */
	public int giveId(IClassifier classifier) {
		return mIdProvider.getId(classifier.getClassifierName());
	}

}
